define('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
  'use strict'

  var oop = require('../lib/oop')
  var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules

  var DocCommentHighlightRules = function() {
    this.$rules = {
      'start': [{
        token: 'comment.doc.tag',
        regex: '@[\\w\\d_]+' // TODO: fix email addresses
      },
      DocCommentHighlightRules.getTagRule(),
      {
        defaultToken: 'comment.doc',
        caseInsensitive: true
      }]
    }
  }

  oop.inherits(DocCommentHighlightRules, TextHighlightRules)

  DocCommentHighlightRules.getTagRule = function(start) {
    return {
      token: 'comment.doc.tag.storage.type',
      regex: '\\b(?:TODO|FIXME|XXX|HACK)\\b'
    }
  }

  DocCommentHighlightRules.getStartRule = function(start) {
    return {
      token: 'comment.doc', // doc comment
      regex: '\\/\\*(?=\\*)',
      next: start
    }
  }

  DocCommentHighlightRules.getEndRule = function(start) {
    return {
      token: 'comment.doc', // closing comment
      regex: '\\*\\/',
      next: start
    }
  }

  exports.DocCommentHighlightRules = DocCommentHighlightRules
})

define('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
  'use strict'

  var oop = require('../lib/oop')
  var DocCommentHighlightRules = require('./doc_comment_highlight_rules').DocCommentHighlightRules
  var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules
  var identifierRe = '[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*'

  var JavaScriptHighlightRules = function(options) {
    var keywordMapper = this.createKeywordMapper({
      'variable.language':
            'Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|' + // Constructors
            'Namespace|QName|XML|XMLList|' + // E4X
            'ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|' +
            'Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|' +
            'Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|' + // Errors
            'SyntaxError|TypeError|URIError|' +
            'decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|' + // Non-constructor functions
            'isNaN|parseFloat|parseInt|' +
            'JSON|Math|' + // Other
            'this|arguments|prototype|window|document', // Pseudo
      'keyword':
            'const|yield|import|get|set|async|await|' +
            'break|case|catch|continue|default|delete|do|else|finally|for|function|' +
            'if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|' +
            '__parent__|__count__|escape|unescape|with|__proto__|' +
            'class|enum|extends|super|export|implements|private|public|interface|package|protected|static',
      'storage.type':
            'const|let|var|function',
      'constant.language':
            'null|Infinity|NaN|undefined',
      'support.function':
            'alert',
      'constant.language.boolean': 'true|false'
    }, 'identifier')
    var kwBeforeRe = 'case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void'

    var escapedRe = '\\\\(?:x[0-9a-fA-F]{2}|' + // hex
        'u[0-9a-fA-F]{4}|' + // unicode
        'u{[0-9a-fA-F]{1,6}}|' + // es6 unicode
        '[0-2][0-7]{0,2}|' + // oct
        '3[0-7][0-7]?|' + // oct
        '[4-7][0-7]?|' + // oct
        '.)'
    this.$rules = {
      'no_regex': [
        DocCommentHighlightRules.getStartRule('doc-start'),
        comments('no_regex'),
        {
          token: 'string',
          regex: "'(?=.)",
          next: 'qstring'
        }, {
          token: 'string',
          regex: '"(?=.)',
          next: 'qqstring'
        }, {
          token: 'constant.numeric', // hexadecimal, octal and binary
          regex: /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/
        }, {
          token: 'constant.numeric', // decimal integers and floats
          regex: /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/
        }, {
          token: [
            'storage.type', 'punctuation.operator', 'support.function',
            'punctuation.operator', 'entity.name.function', 'text', 'keyword.operator'
          ],
          regex: '(' + identifierRe + ')(\\.)(prototype)(\\.)(' + identifierRe + ')(\\s*)(=)',
          next: 'function_arguments'
        }, {
          token: [
            'storage.type', 'punctuation.operator', 'entity.name.function', 'text',
            'keyword.operator', 'text', 'storage.type', 'text', 'paren.lparen'
          ],
          regex: '(' + identifierRe + ')(\\.)(' + identifierRe + ')(\\s*)(=)(\\s*)(function)(\\s*)(\\()',
          next: 'function_arguments'
        }, {
          token: [
            'entity.name.function', 'text', 'keyword.operator', 'text', 'storage.type',
            'text', 'paren.lparen'
          ],
          regex: '(' + identifierRe + ')(\\s*)(=)(\\s*)(function)(\\s*)(\\()',
          next: 'function_arguments'
        }, {
          token: [
            'storage.type', 'punctuation.operator', 'entity.name.function', 'text',
            'keyword.operator', 'text',
            'storage.type', 'text', 'entity.name.function', 'text', 'paren.lparen'
          ],
          regex: '(' + identifierRe + ')(\\.)(' + identifierRe + ')(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()',
          next: 'function_arguments'
        }, {
          token: [
            'storage.type', 'text', 'entity.name.function', 'text', 'paren.lparen'
          ],
          regex: '(function)(\\s+)(' + identifierRe + ')(\\s*)(\\()',
          next: 'function_arguments'
        }, {
          token: [
            'entity.name.function', 'text', 'punctuation.operator',
            'text', 'storage.type', 'text', 'paren.lparen'
          ],
          regex: '(' + identifierRe + ')(\\s*)(:)(\\s*)(function)(\\s*)(\\()',
          next: 'function_arguments'
        }, {
          token: [
            'text', 'text', 'storage.type', 'text', 'paren.lparen'
          ],
          regex: '(:)(\\s*)(function)(\\s*)(\\()',
          next: 'function_arguments'
        }, {
          token: 'keyword',
          regex: "from(?=\\s*('|\"))"
        }, {
          token: 'keyword',
          regex: '(?:' + kwBeforeRe + ')\\b',
          next: 'start'
        }, {
          token: ['support.constant'],
          regex: /that\b/
        }, {
          token: ['storage.type', 'punctuation.operator', 'support.function.firebug'],
          regex: /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
        }, {
          token: keywordMapper,
          regex: identifierRe
        }, {
          token: 'punctuation.operator',
          regex: /[.](?![.])/,
          next: 'property'
        }, {
          token: 'storage.type',
          regex: /=>/,
          next: 'start'
        }, {
          token: 'keyword.operator',
          regex: /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,
          next: 'start'
        }, {
          token: 'punctuation.operator',
          regex: /[?:,;.]/,
          next: 'start'
        }, {
          token: 'paren.lparen',
          regex: /[\[({]/,
          next: 'start'
        }, {
          token: 'paren.rparen',
          regex: /[\])}]/
        }, {
          token: 'comment',
          regex: /^#!.*$/
        }
      ],
      property: [{
        token: 'text',
        regex: '\\s+'
      }, {
        token: [
          'storage.type', 'punctuation.operator', 'entity.name.function', 'text',
          'keyword.operator', 'text',
          'storage.type', 'text', 'entity.name.function', 'text', 'paren.lparen'
        ],
        regex: '(' + identifierRe + ')(\\.)(' + identifierRe + ')(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()',
        next: 'function_arguments'
      }, {
        token: 'punctuation.operator',
        regex: /[.](?![.])/
      }, {
        token: 'support.function',
        regex: /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
      }, {
        token: 'support.function.dom',
        regex: /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
      }, {
        token: 'support.constant',
        regex: /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/
      }, {
        token: 'identifier',
        regex: identifierRe
      }, {
        regex: '',
        token: 'empty',
        next: 'no_regex'
      }
      ],
      'start': [
        DocCommentHighlightRules.getStartRule('doc-start'),
        comments('start'),
        {
          token: 'string.regexp',
          regex: '\\/',
          next: 'regex'
        }, {
          token: 'text',
          regex: '\\s+|^$',
          next: 'start'
        }, {
          token: 'empty',
          regex: '',
          next: 'no_regex'
        }
      ],
      'regex': [
        {
          token: 'regexp.keyword.operator',
          regex: '\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)'
        }, {
          token: 'string.regexp',
          regex: '/[sxngimy]*',
          next: 'no_regex'
        }, {
          token: 'invalid',
          regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
        }, {
          token: 'constant.language.escape',
          regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
        }, {
          token: 'constant.language.delimiter',
          regex: /\|/
        }, {
          token: 'constant.language.escape',
          regex: /\[\^?/,
          next: 'regex_character_class'
        }, {
          token: 'empty',
          regex: '$',
          next: 'no_regex'
        }, {
          defaultToken: 'string.regexp'
        }
      ],
      'regex_character_class': [
        {
          token: 'regexp.charclass.keyword.operator',
          regex: '\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)'
        }, {
          token: 'constant.language.escape',
          regex: ']',
          next: 'regex'
        }, {
          token: 'constant.language.escape',
          regex: '-'
        }, {
          token: 'empty',
          regex: '$',
          next: 'no_regex'
        }, {
          defaultToken: 'string.regexp.charachterclass'
        }
      ],
      'function_arguments': [
        {
          token: 'variable.parameter',
          regex: identifierRe
        }, {
          token: 'punctuation.operator',
          regex: '[, ]+'
        }, {
          token: 'punctuation.operator',
          regex: '$'
        }, {
          token: 'empty',
          regex: '',
          next: 'no_regex'
        }
      ],
      'qqstring': [
        {
          token: 'constant.language.escape',
          regex: escapedRe
        }, {
          token: 'string',
          regex: '\\\\$',
          consumeLineEnd: true
        }, {
          token: 'string',
          regex: '"|$',
          next: 'no_regex'
        }, {
          defaultToken: 'string'
        }
      ],
      'qstring': [
        {
          token: 'constant.language.escape',
          regex: escapedRe
        }, {
          token: 'string',
          regex: '\\\\$',
          consumeLineEnd: true
        }, {
          token: 'string',
          regex: "'|$",
          next: 'no_regex'
        }, {
          defaultToken: 'string'
        }
      ]
    }

    if (!options || !options.noES6) {
      this.$rules.no_regex.unshift({
        regex: '[{}]', onMatch: function(val, state, stack) {
          this.next = val == '{' ? this.nextState : ''
          if (val == '{' && stack.length) {
            stack.unshift('start', state)
          } else if (val == '}' && stack.length) {
            stack.shift()
            this.next = stack.shift()
            if (this.next.indexOf('string') != -1 || this.next.indexOf('jsx') != -1) { return 'paren.quasi.end' }
          }
          return val == '{' ? 'paren.lparen' : 'paren.rparen'
        },
        nextState: 'start'
      }, {
        token: 'string.quasi.start',
        regex: /`/,
        push: [{
          token: 'constant.language.escape',
          regex: escapedRe
        }, {
          token: 'paren.quasi.start',
          regex: /\${/,
          push: 'start'
        }, {
          token: 'string.quasi.end',
          regex: /`/,
          next: 'pop'
        }, {
          defaultToken: 'string.quasi'
        }]
      })

      if (!options || options.jsx != false) { JSX.call(this) }
    }

    this.embedRules(DocCommentHighlightRules, 'doc-',
      [DocCommentHighlightRules.getEndRule('no_regex')])

    this.normalizeRules()
  }

  oop.inherits(JavaScriptHighlightRules, TextHighlightRules)

  function JSX() {
    var tagRegex = identifierRe.replace('\\d', '\\d\\-')
    var jsxTag = {
      onMatch: function(val, state, stack) {
        var offset = val.charAt(1) == '/' ? 2 : 1
        if (offset == 1) {
          if (state != this.nextState) { stack.unshift(this.next, this.nextState, 0) } else { stack.unshift(this.next) }
          stack[2]++
        } else if (offset == 2) {
          if (state == this.nextState) {
            stack[1]--
            if (!stack[1] || stack[1] < 0) {
              stack.shift()
              stack.shift()
            }
          }
        }
        return [{
          type: 'meta.tag.punctuation.' + (offset == 1 ? '' : 'end-') + 'tag-open.xml',
          value: val.slice(0, offset)
        }, {
          type: 'meta.tag.tag-name.xml',
          value: val.substr(offset)
        }]
      },
      regex: '</?' + tagRegex + '',
      next: 'jsxAttributes',
      nextState: 'jsx'
    }
    this.$rules.start.unshift(jsxTag)
    var jsxJsRule = {
      regex: '{',
      token: 'paren.quasi.start',
      push: 'start'
    }
    this.$rules.jsx = [
      jsxJsRule,
      jsxTag,
      { include: 'reference' },
      { defaultToken: 'string' }
    ]
    this.$rules.jsxAttributes = [{
      token: 'meta.tag.punctuation.tag-close.xml',
      regex: '/?>',
      onMatch: function(value, currentState, stack) {
        if (currentState == stack[0]) { stack.shift() }
        if (value.length == 2) {
          if (stack[0] == this.nextState) { stack[1]-- }
          if (!stack[1] || stack[1] < 0) {
            stack.splice(0, 2)
          }
        }
        this.next = stack[0] || 'start'
        return [{ type: this.token, value: value }]
      },
      nextState: 'jsx'
    },
    jsxJsRule,
    comments('jsxAttributes'),
    {
      token: 'entity.other.attribute-name.xml',
      regex: tagRegex
    }, {
      token: 'keyword.operator.attribute-equals.xml',
      regex: '='
    }, {
      token: 'text.tag-whitespace.xml',
      regex: '\\s+'
    }, {
      token: 'string.attribute-value.xml',
      regex: "'",
      stateName: 'jsx_attr_q',
      push: [
        { token: 'string.attribute-value.xml', regex: "'", next: 'pop' },
        { include: 'reference' },
        { defaultToken: 'string.attribute-value.xml' }
      ]
    }, {
      token: 'string.attribute-value.xml',
      regex: '"',
      stateName: 'jsx_attr_qq',
      push: [
        { token: 'string.attribute-value.xml', regex: '"', next: 'pop' },
        { include: 'reference' },
        { defaultToken: 'string.attribute-value.xml' }
      ]
    },
    jsxTag
    ]
    this.$rules.reference = [{
      token: 'constant.language.escape.reference.xml',
      regex: '(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)'
    }]
  }

  function comments(next) {
    return [
      {
        token: 'comment', // multi line comment
        regex: /\/\*/,
        next: [
          DocCommentHighlightRules.getTagRule(),
          { token: 'comment', regex: '\\*\\/', next: next || 'pop' },
          { defaultToken: 'comment', caseInsensitive: true }
        ]
      }, {
        token: 'comment',
        regex: '\\/\\/',
        next: [
          DocCommentHighlightRules.getTagRule(),
          { token: 'comment', regex: '$|^', next: next || 'pop' },
          { defaultToken: 'comment', caseInsensitive: true }
        ]
      }
    ]
  }
  exports.JavaScriptHighlightRules = JavaScriptHighlightRules
})

define('ace/mode/css_highlight_rules', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
  'use strict'

  var oop = require('../lib/oop')
  var lang = require('../lib/lang')
  var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules
  var supportType = exports.supportType = 'align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|max-zoom|min-height|min-width|min-zoom|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|user-select|user-zoom|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index'
  var supportFunction = exports.supportFunction = 'rgb|rgba|url|attr|counter|counters'
  var supportConstant = exports.supportConstant = 'absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero|zoom'
  var supportConstantColor = exports.supportConstantColor = 'aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen'
  var supportConstantFonts = exports.supportConstantFonts = 'arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace'

  var numRe = exports.numRe = '\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))'
  var pseudoElements = exports.pseudoElements = '(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b'
  var pseudoClasses = exports.pseudoClasses = '(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b'

  var CssHighlightRules = function() {
    var keywordMapper = this.createKeywordMapper({
      'support.function': supportFunction,
      'support.constant': supportConstant,
      'support.type': supportType,
      'support.constant.color': supportConstantColor,
      'support.constant.fonts': supportConstantFonts
    }, 'text', true)
    this.$rules = {
      'start': [{
        include: ['strings', 'url', 'comments']
      }, {
        token: 'paren.lparen',
        regex: '\\{',
        next: 'ruleset'
      }, {
        token: 'paren.rparen',
        regex: '\\}'
      }, {
        token: 'string',
        regex: '@(?!viewport)',
        next: 'media'
      }, {
        token: 'keyword',
        regex: '#[a-z0-9-_]+'
      }, {
        token: 'keyword',
        regex: '%'
      }, {
        token: 'variable',
        regex: '\\.[a-z0-9-_]+'
      }, {
        token: 'string',
        regex: ':[a-z0-9-_]+'
      }, {
        token: 'constant.numeric',
        regex: numRe
      }, {
        token: 'constant',
        regex: '[a-z0-9-_]+'
      }, {
        caseInsensitive: true
      }],

      'media': [{
        include: ['strings', 'url', 'comments']
      }, {
        token: 'paren.lparen',
        regex: '\\{',
        next: 'start'
      }, {
        token: 'paren.rparen',
        regex: '\\}',
        next: 'start'
      }, {
        token: 'string',
        regex: ';',
        next: 'start'
      }, {
        token: 'keyword',
        regex: '(?:media|supports|document|charset|import|namespace|media|supports|document' +
                '|page|font|keyframes|viewport|counter-style|font-feature-values' +
                '|swash|ornaments|annotation|stylistic|styleset|character-variant)'
      }],

      'comments': [{
        token: 'comment', // multi line comment
        regex: '\\/\\*',
        push: [{
          token: 'comment',
          regex: '\\*\\/',
          next: 'pop'
        }, {
          defaultToken: 'comment'
        }]
      }],

      'ruleset': [{
        regex: '-(webkit|ms|moz|o)-',
        token: 'text'
      }, {
        token: 'punctuation.operator',
        regex: '[:;]'
      }, {
        token: 'paren.rparen',
        regex: '\\}',
        next: 'start'
      }, {
        include: ['strings', 'url', 'comments']
      }, {
        token: ['constant.numeric', 'keyword'],
        regex: '(' + numRe + ')(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vm|vw|%)'
      }, {
        token: 'constant.numeric',
        regex: numRe
      }, {
        token: 'constant.numeric', // hex6 color
        regex: '#[a-f0-9]{6}'
      }, {
        token: 'constant.numeric', // hex3 color
        regex: '#[a-f0-9]{3}'
      }, {
        token: ['punctuation', 'entity.other.attribute-name.pseudo-element.css'],
        regex: pseudoElements
      }, {
        token: ['punctuation', 'entity.other.attribute-name.pseudo-class.css'],
        regex: pseudoClasses
      }, {
        include: 'url'
      }, {
        token: keywordMapper,
        regex: '\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*'
      }, {
        caseInsensitive: true
      }],

      url: [{
        token: 'support.function',
        regex: '(?:url(:?-prefix)?|domain|regexp)\\(',
        push: [{
          token: 'support.function',
          regex: '\\)',
          next: 'pop'
        }, {
          defaultToken: 'string'
        }]
      }],

      strings: [{
        token: 'string.start',
        regex: "'",
        push: [{
          token: 'string.end',
          regex: "'|$",
          next: 'pop'
        }, {
          include: 'escapes'
        }, {
          token: 'constant.language.escape',
          regex: /\\$/,
          consumeLineEnd: true
        }, {
          defaultToken: 'string'
        }]
      }, {
        token: 'string.start',
        regex: '"',
        push: [{
          token: 'string.end',
          regex: '"|$',
          next: 'pop'
        }, {
          include: 'escapes'
        }, {
          token: 'constant.language.escape',
          regex: /\\$/,
          consumeLineEnd: true
        }, {
          defaultToken: 'string'
        }]
      }],
      escapes: [{
        token: 'constant.language.escape',
        regex: /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/
      }]

    }

    this.normalizeRules()
  }

  oop.inherits(CssHighlightRules, TextHighlightRules)

  exports.CssHighlightRules = CssHighlightRules
})

define('ace/mode/xml_highlight_rules', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {
  'use strict'

  var oop = require('../lib/oop')
  var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules

  var XmlHighlightRules = function(normalize) {
    var tagRegex = '[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*'

    this.$rules = {
      start: [
        { token: 'string.cdata.xml', regex: '<\\!\\[CDATA\\[', next: 'cdata' },
        {
          token: ['punctuation.instruction.xml', 'keyword.instruction.xml'],
          regex: '(<\\?)(' + tagRegex + ')', next: 'processing_instruction'
        },
        { token: 'comment.start.xml', regex: '<\\!--', next: 'comment' },
        {
          token: ['xml-pe.doctype.xml', 'xml-pe.doctype.xml'],
          regex: '(<\\!)(DOCTYPE)(?=[\\s])', next: 'doctype', caseInsensitive: true
        },
        { include: 'tag' },
        { token: 'text.end-tag-open.xml', regex: '</' },
        { token: 'text.tag-open.xml', regex: '<' },
        { include: 'reference' },
        { defaultToken: 'text.xml' }
      ],

      processing_instruction: [{
        token: 'entity.other.attribute-name.decl-attribute-name.xml',
        regex: tagRegex
      }, {
        token: 'keyword.operator.decl-attribute-equals.xml',
        regex: '='
      }, {
        include: 'whitespace'
      }, {
        include: 'string'
      }, {
        token: 'punctuation.xml-decl.xml',
        regex: '\\?>',
        next: 'start'
      }],

      doctype: [
        { include: 'whitespace' },
        { include: 'string' },
        { token: 'xml-pe.doctype.xml', regex: '>', next: 'start' },
        { token: 'xml-pe.xml', regex: '[-_a-zA-Z0-9:]+' },
        { token: 'punctuation.int-subset', regex: '\\[', push: 'int_subset' }
      ],

      int_subset: [{
        token: 'text.xml',
        regex: '\\s+'
      }, {
        token: 'punctuation.int-subset.xml',
        regex: ']',
        next: 'pop'
      }, {
        token: ['punctuation.markup-decl.xml', 'keyword.markup-decl.xml'],
        regex: '(<\\!)(' + tagRegex + ')',
        push: [{
          token: 'text',
          regex: '\\s+'
        },
        {
          token: 'punctuation.markup-decl.xml',
          regex: '>',
          next: 'pop'
        },
        { include: 'string' }]
      }],

      cdata: [
        { token: 'string.cdata.xml', regex: '\\]\\]>', next: 'start' },
        { token: 'text.xml', regex: '\\s+' },
        { token: 'text.xml', regex: '(?:[^\\]]|\\](?!\\]>))+' }
      ],

      comment: [
        { token: 'comment.end.xml', regex: '-->', next: 'start' },
        { defaultToken: 'comment.xml' }
      ],

      reference: [{
        token: 'constant.language.escape.reference.xml',
        regex: '(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)'
      }],

      attr_reference: [{
        token: 'constant.language.escape.reference.attribute-value.xml',
        regex: '(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)'
      }],

      tag: [{
        token: ['meta.tag.punctuation.tag-open.xml', 'meta.tag.punctuation.end-tag-open.xml', 'meta.tag.tag-name.xml'],
        regex: '(?:(<)|(</))((?:' + tagRegex + ':)?' + tagRegex + ')',
        next: [
          { include: 'attributes' },
          { token: 'meta.tag.punctuation.tag-close.xml', regex: '/?>', next: 'start' }
        ]
      }],

      tag_whitespace: [
        { token: 'text.tag-whitespace.xml', regex: '\\s+' }
      ],
      whitespace: [
        { token: 'text.whitespace.xml', regex: '\\s+' }
      ],
      string: [{
        token: 'string.xml',
        regex: "'",
        push: [
          { token: 'string.xml', regex: "'", next: 'pop' },
          { defaultToken: 'string.xml' }
        ]
      }, {
        token: 'string.xml',
        regex: '"',
        push: [
          { token: 'string.xml', regex: '"', next: 'pop' },
          { defaultToken: 'string.xml' }
        ]
      }],

      attributes: [{
        token: 'entity.other.attribute-name.xml',
        regex: tagRegex
      }, {
        token: 'keyword.operator.attribute-equals.xml',
        regex: '='
      }, {
        include: 'tag_whitespace'
      }, {
        include: 'attribute_value'
      }],

      attribute_value: [{
        token: 'string.attribute-value.xml',
        regex: "'",
        push: [
          { token: 'string.attribute-value.xml', regex: "'", next: 'pop' },
          { include: 'attr_reference' },
          { defaultToken: 'string.attribute-value.xml' }
        ]
      }, {
        token: 'string.attribute-value.xml',
        regex: '"',
        push: [
          { token: 'string.attribute-value.xml', regex: '"', next: 'pop' },
          { include: 'attr_reference' },
          { defaultToken: 'string.attribute-value.xml' }
        ]
      }]
    }

    if (this.constructor === XmlHighlightRules) { this.normalizeRules() }
  };

  (function() {
    this.embedTagRules = function(HighlightRules, prefix, tag) {
      this.$rules.tag.unshift({
        token: ['meta.tag.punctuation.tag-open.xml', 'meta.tag.' + tag + '.tag-name.xml'],
        regex: '(<)(' + tag + '(?=\\s|>|$))',
        next: [
          { include: 'attributes' },
          { token: 'meta.tag.punctuation.tag-close.xml', regex: '/?>', next: prefix + 'start' }
        ]
      })

      this.$rules[tag + '-end'] = [
        { include: 'attributes' },
        { token: 'meta.tag.punctuation.tag-close.xml', regex: '/?>', next: 'start',
          onMatch: function(value, currentState, stack) {
            stack.splice(0)
            return this.token
          } }
      ]

      this.embedRules(HighlightRules, prefix, [{
        token: ['meta.tag.punctuation.end-tag-open.xml', 'meta.tag.' + tag + '.tag-name.xml'],
        regex: '(</)(' + tag + '(?=\\s|>|$))',
        next: tag + '-end'
      }, {
        token: 'string.cdata.xml',
        regex: '<\\!\\[CDATA\\['
      }, {
        token: 'string.cdata.xml',
        regex: '\\]\\]>'
      }])
    }
  }).call(TextHighlightRules.prototype)

  oop.inherits(XmlHighlightRules, TextHighlightRules)

  exports.XmlHighlightRules = XmlHighlightRules
})

define('ace/mode/html_highlight_rules', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules'], function(require, exports, module) {
  'use strict'

  var oop = require('../lib/oop')
  var lang = require('../lib/lang')
  var CssHighlightRules = require('./css_highlight_rules').CssHighlightRules
  var JavaScriptHighlightRules = require('./javascript_highlight_rules').JavaScriptHighlightRules
  var XmlHighlightRules = require('./xml_highlight_rules').XmlHighlightRules

  var tagMap = lang.createMap({
    a: 'anchor',
    button: 'form',
    form: 'form',
    img: 'image',
    input: 'form',
    label: 'form',
    option: 'form',
    script: 'script',
    select: 'form',
    textarea: 'form',
    style: 'style',
    table: 'table',
    tbody: 'table',
    td: 'table',
    tfoot: 'table',
    th: 'table',
    tr: 'table'
  })

  var HtmlHighlightRules = function() {
    XmlHighlightRules.call(this)

    this.addRules({
      attributes: [{
        include: 'tag_whitespace'
      }, {
        token: 'entity.other.attribute-name.xml',
        regex: '[-_a-zA-Z0-9:.]+'
      }, {
        token: 'keyword.operator.attribute-equals.xml',
        regex: '=',
        push: [{
          include: 'tag_whitespace'
        }, {
          token: 'string.unquoted.attribute-value.html',
          regex: "[^<>='\"`\\s]+",
          next: 'pop'
        }, {
          token: 'empty',
          regex: '',
          next: 'pop'
        }]
      }, {
        include: 'attribute_value'
      }],
      tag: [{
        token: function(start, tag) {
          var group = tagMap[tag]
          return ['meta.tag.punctuation.' + (start == '<' ? '' : 'end-') + 'tag-open.xml',
            'meta.tag' + (group ? '.' + group : '') + '.tag-name.xml']
        },
        regex: '(</?)([-_a-zA-Z0-9:.]+)',
        next: 'tag_stuff'
      }],
      tag_stuff: [
        { include: 'attributes' },
        { token: 'meta.tag.punctuation.tag-close.xml', regex: '/?>', next: 'start' }
      ]
    })

    this.embedTagRules(CssHighlightRules, 'css-', 'style')
    this.embedTagRules(new JavaScriptHighlightRules({ jsx: false }).getRules(), 'js-', 'script')

    if (this.constructor === HtmlHighlightRules) { this.normalizeRules() }
  }

  oop.inherits(HtmlHighlightRules, XmlHighlightRules)

  exports.HtmlHighlightRules = HtmlHighlightRules
})

define('ace/mode/markdown_highlight_rules', ['require', 'exports', 'module', 'ace/config', 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/html_highlight_rules'], function(require, exports, module) {
  'use strict'

  var modes = require('../config').$modes

  var oop = require('../lib/oop')
  var lang = require('../lib/lang')
  var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules
  var HtmlHighlightRules = require('./html_highlight_rules').HtmlHighlightRules

  var escaped = function(ch) {
    return '(?:[^' + lang.escapeRegExp(ch) + '\\\\]|\\\\.)*'
  }

  var MarkdownHighlightRules = function() {
    HtmlHighlightRules.call(this)
    var codeBlockStartRule = {
      token: 'support.function',
      regex: /^\s*(```+[^`]*|~~~+[^~]*)$/,
      onMatch: function(value, state, stack, line) {
        var m = value.match(/^(\s*)([`~]+)(.*)/)
        var language = /[\w-]+|$/.exec(m[3])[0]
        if (!modes[language]) { language = '' }
        stack.unshift('githubblock', [], [m[1], m[2], language], state)
        return this.token
      },
      next: 'githubblock'
    }
    var codeBlockRules = [{
      token: 'support.function',
      regex: '.*',
      onMatch: function(value, state, stack, line) {
        var embedState = stack[1]
        var indent = stack[2][0]
        var endMarker = stack[2][1]
        var language = stack[2][2]

        var m = /^(\s*)(`+|~+)\s*$/.exec(value)
        if (
          m && m[1].length < indent.length + 3 &&
                m[2].length >= endMarker.length && m[2][0] == endMarker[0]
        ) {
          stack.splice(0, 3)
          this.next = stack.shift()
          return this.token
        }
        this.next = ''
        if (language && modes[language]) {
          var data = modes[language].getTokenizer().getLineTokens(value, embedState.slice(0))
          stack[1] = data.state
          return data.tokens
        }
        return this.token
      }
    }]

    this.$rules['start'].unshift({
      token: 'empty_line',
      regex: '^$',
      next: 'allowBlock'
    }, { // h1
      token: 'markup.heading.1',
      regex: '^=+(?=\\s*$)'
    }, { // h2
      token: 'markup.heading.2',
      regex: '^\\-+(?=\\s*$)'
    }, {
      token: function(value) {
        return 'markup.heading.' + value.length
      },
      regex: /^#{1,6}(?=\s|$)/,
      next: 'header'
    },
    codeBlockStartRule,
    { // block quote
      token: 'string.blockquote',
      regex: '^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+',
      next: 'blockquote'
    }, { // HR * - _
      token: 'constant',
      regex: '^ {0,2}(?:(?: ?\\* ?){3,}|(?: ?\\- ?){3,}|(?: ?\\_ ?){3,})\\s*$',
      next: 'allowBlock'
    }, { // list
      token: 'markup.list',
      regex: '^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+',
      next: 'listblock-start'
    }, {
      include: 'basic'
    })

    this.addRules({
      'basic': [{
        token: 'constant.language.escape',
        regex: /\\[\\`*_{}\[\]()#+\-.!]/
      }, { // code span `
        token: 'support.function',
        regex: '(`+)(.*?[^`])(\\1)'
      }, { // reference
        token: ['text', 'constant', 'text', 'url', 'string', 'text'],
        regex: '^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:["][^"]+["])?(\\s*))$'
      }, { // link by reference
        token: ['text', 'string', 'text', 'constant', 'text'],
        regex: '(\\[)(' + escaped(']') + ')(\\]\\s*\\[)(' + escaped(']') + ')(\\])'
      }, { // link by url
        token: ['text', 'string', 'text', 'markup.underline', 'string', 'text'],
        regex: '(\\!?\\[)(' + // [
                    escaped(']') + // link text or alt text
                    ')(\\]\\()' + // ](
                    '((?:[^\\)\\s\\\\]|\\\\.|\\s(?=[^"]))*)' + // href or image
                    '(\\s*"' + escaped('"') + '"\\s*)?' + // "title"
                    '(\\))' // )
      }, { // strong ** __
        token: 'string.strong',
        regex: '([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)'
      }, { // emphasis * _
        token: 'string.emphasis',
        regex: '([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)'
      }, { //
        token: ['text', 'url', 'text'],
        regex: '(<)(' +
                      "(?:https?|ftp|dict):[^'\">\\s]+" +
                      '|' +
                      '(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+' +
                    ')(>)'
      }],
      'allowBlock': [
        { token: 'support.function', regex: '^ {4}.+', next: 'allowBlock' },
        { token: 'empty_line', regex: '^$', next: 'allowBlock' },
        { token: 'empty', regex: '', next: 'start' }
      ],

      'header': [{
        regex: '$',
        next: 'start'
      }, {
        include: 'basic'
      }, {
        defaultToken: 'heading'
      }],

      'listblock-start': [{
        token: 'support.variable',
        regex: /(?:\[[ x]\])?/,
        next: 'listblock'
      }],

      'listblock': [{ // Lists only escape on completely blank lines.
        token: 'empty_line',
        regex: '^$',
        next: 'start'
      }, { // list
        token: 'markup.list',
        regex: '^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+',
        next: 'listblock-start'
      }, {
        include: 'basic', noEscape: true
      },
      codeBlockStartRule,
      {
        defaultToken: 'list' // do not use markup.list to allow stling leading `*` differntly
      }],

      'blockquote': [{ // Blockquotes only escape on blank lines.
        token: 'empty_line',
        regex: '^\\s*$',
        next: 'start'
      }, { // block quote
        token: 'string.blockquote',
        regex: '^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+',
        next: 'blockquote'
      }, {
        include: 'basic', noEscape: true
      }, {
        defaultToken: 'string.blockquote'
      }],

      'githubblock': codeBlockRules
    })

    this.normalizeRules()
  }
  oop.inherits(MarkdownHighlightRules, TextHighlightRules)

  exports.MarkdownHighlightRules = MarkdownHighlightRules
})

define('ace/mode/mask_highlight_rules', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/css_highlight_rules', 'ace/mode/markdown_highlight_rules', 'ace/mode/html_highlight_rules'], function(require, exports, module) {
  'use strict'

  exports.MaskHighlightRules = MaskHighlightRules

  var oop = require('../lib/oop')
  var lang = require('../lib/lang')
  var TextRules = require('./text_highlight_rules').TextHighlightRules
  var JSRules = require('./javascript_highlight_rules').JavaScriptHighlightRules
  var CssRules = require('./css_highlight_rules').CssHighlightRules
  var MDRules = require('./markdown_highlight_rules').MarkdownHighlightRules
  var HTMLRules = require('./html_highlight_rules').HtmlHighlightRules

  var token_TAG = 'keyword.support.constant.language',
    token_COMPO = 'support.function.markup.bold',
    token_KEYWORD = 'keyword',
    token_LANG = 'constant.language',
    token_UTIL = 'keyword.control.markup.italic',
    token_ATTR = 'support.variable.class',
    token_PUNKT = 'keyword.operator',
    token_ITALIC = 'markup.italic',
    token_BOLD = 'markup.bold',
    token_LPARE = 'paren.lparen',
    token_RPARE = 'paren.rparen'

  var const_FUNCTIONS,
    const_KEYWORDS,
    const_CONST,
    const_TAGS;
  (function() {
    const_FUNCTIONS = lang.arrayToMap(
      ('log').split('|')
    )
    const_CONST = lang.arrayToMap(
      (':dualbind|:bind|:import|slot|event|style|html|markdown|md').split('|')
    )
    const_KEYWORDS = lang.arrayToMap(
      ('debugger|define|var|if|each|for|of|else|switch|case|with|visible|+if|+each|+for|+switch|+with|+visible|include|import').split('|')
    )
    const_TAGS = lang.arrayToMap(
      ('a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|' +
         'big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|' +
         'command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|' +
         'figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|' +
         'header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|' +
         'link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|' +
         'option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|' +
         'small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|' +
         'textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp').split('|')
    )
  }())

  function MaskHighlightRules() {
    this.$rules = {
      'start': [
        Token('comment', '\\/\\/.*$'),
        Token('comment', '\\/\\*', [
          Token('comment', '.*?\\*\\/', 'start'),
          Token('comment', '.+')
        ]),

        Blocks.string("'''"),
        Blocks.string('"""'),
        Blocks.string('"'),
        Blocks.string("'"),

        Blocks.syntax(/(markdown|md)\b/, 'md-multiline', 'multiline'),
        Blocks.syntax(/html\b/, 'html-multiline', 'multiline'),
        Blocks.syntax(/(slot|event)\b/, 'js-block', 'block'),
        Blocks.syntax(/style\b/, 'css-block', 'block'),
        Blocks.syntax(/var\b/, 'js-statement', 'attr'),

        Blocks.tag(),

        Token(token_LPARE, '[[({>]'),
        Token(token_RPARE, '[\\])};]', 'start'),
        {
          caseInsensitive: true
        }
      ]
    }
    var rules = this

    addJavaScript('interpolation', /\]/, token_RPARE + '.' + token_ITALIC)
    addJavaScript('statement', /\)|}|;/)
    addJavaScript('block', /\}/)
    addCss()
    addMarkdown()
    addHtml()

    function addJavaScript(name, escape, closeType) {
      var prfx = 'js-' + name + '-',
        rootTokens = name === 'block' ? ['start'] : ['start', 'no_regex']
      add(
        JSRules
        , prfx
        , escape
        , rootTokens
        , closeType
      )
    }
    function addCss() {
      add(CssRules, 'css-block-', /\}/)
    }
    function addMarkdown() {
      add(MDRules, 'md-multiline-', /("""|''')/, [])
    }
    function addHtml() {
      add(HTMLRules, 'html-multiline-', /("""|''')/)
    }
    function add(Rules, strPrfx, rgxEnd, rootTokens, closeType) {
      var next = 'pop'
      var tokens = rootTokens || ['start']
      if (tokens.length === 0) {
        tokens = null
      }
      if (/block|multiline/.test(strPrfx)) {
        next = strPrfx + 'end'
        rules.$rules[next] = [
          Token('empty', '', 'start')
        ]
      }
      rules.embedRules(
        Rules
        , strPrfx
        , [Token(closeType || token_RPARE, rgxEnd, next)]
        , tokens
        , tokens == null
      )
    }

    this.normalizeRules()
  }
  oop.inherits(MaskHighlightRules, TextRules)

  var Blocks = {
    string: function(str, next) {
      var token = Token(
        'string.start'
        , str
        , [
          Token(token_LPARE + '.' + token_ITALIC, /~\[/, Blocks.interpolation()),
          Token('string.end', str, 'pop'),
          {
            defaultToken: 'string'
          }
        ]
        , next
      )
      if (str.length === 1) {
        var escaped = Token('string.escape', '\\\\' + str)
        token.push.unshift(escaped)
      }
      return token
    },
    interpolation: function() {
      return [
        Token(token_UTIL, /\s*\w*\s*:/),
        'js-interpolation-start'
      ]
    },
    tagHead: function(rgx) {
      return Token(token_ATTR, rgx, [
        Token(token_ATTR, /[\w\-_]+/),
        Token(token_LPARE + '.' + token_ITALIC, /~\[/, Blocks.interpolation()),
        Blocks.goUp()
      ])
    },
    tag: function() {
      return {
        token: 'tag',
        onMatch: function(value) {
          if (void 0 !== const_KEYWORDS[value]) { return token_KEYWORD }
          if (void 0 !== const_CONST[value]) { return token_LANG }
          if (void 0 !== const_FUNCTIONS[value]) { return 'support.function' }
          if (void 0 !== const_TAGS[value.toLowerCase()]) { return token_TAG }

          return token_COMPO
        },
        regex: /([@\w\-_:+]+)|((^|\s)(?=\s*(\.|#)))/,
        push: [
          Blocks.tagHead(/\./),
          Blocks.tagHead(/#/),
          Blocks.expression(),
          Blocks.attribute(),

          Token(token_LPARE, /[;>{]/, 'pop')
        ]
      }
    },
    syntax: function(rgx, next, type) {
      return {
        token: token_LANG,
        regex: rgx,
        push: ({
          'attr': [
            next + '-start',
            Token(token_PUNKT, /;/, 'start')
          ],
          'multiline': [
            Blocks.tagHead(/\./),
            Blocks.tagHead(/#/),
            Blocks.attribute(),
            Blocks.expression(),
            Token(token_LPARE, /[>\{]/),
            Token(token_PUNKT, /;/, 'start'),
            Token(token_LPARE, /'''|"""/, [next + '-start'])
          ],
          'block': [
            Blocks.tagHead(/\./),
            Blocks.tagHead(/#/),
            Blocks.attribute(),
            Blocks.expression(),
            Token(token_LPARE, /\{/, [next + '-start'])
          ]
        })[type]
      }
    },
    attribute: function() {
      return Token(function(value) {
        return /^x\-/.test(value)
          ? token_ATTR + '.' + token_BOLD
          : token_ATTR
      }, /[\w_-]+/, [
        Token(token_PUNKT, /\s*=\s*/, [
          Blocks.string('"'),
          Blocks.string("'"),
          Blocks.word(),
          Blocks.goUp()
        ]),
        Blocks.goUp()
      ])
    },
    expression: function() {
      return Token(token_LPARE, /\(/, ['js-statement-start'])
    },
    word: function() {
      return Token('string', /[\w-_]+/)
    },
    goUp: function() {
      return Token('text', '', 'pop')
    },
    goStart: function() {
      return Token('text', '', 'start')
    }
  }

  function Token(token, rgx, mix) {
    var push, next, onMatch
    if (arguments.length === 4) {
      push = mix
      next = arguments[3]
    } else if (typeof mix === 'string') {
      next = mix
    } else {
      push = mix
    }
    if (typeof token === 'function') {
      onMatch = token
      token = 'empty'
    }
    return {
      token: token,
      regex: rgx,
      push: push,
      next: next,
      onMatch: onMatch
    }
  }
})

define('ace/mode/matching_brace_outdent', ['require', 'exports', 'module', 'ace/range'], function(require, exports, module) {
  'use strict'

  var Range = require('../range').Range

  var MatchingBraceOutdent = function() {};

  (function() {
    this.checkOutdent = function(line, input) {
      if (!/^\s+$/.test(line)) { return false }

      return /^\s*\}/.test(input)
    }

    this.autoOutdent = function(doc, row) {
      var line = doc.getLine(row)
      var match = line.match(/^(\s*\})/)

      if (!match) return 0

      var column = match[1].length
      var openBracePos = doc.findMatchingBracket({ row: row, column: column })

      if (!openBracePos || openBracePos.row == row) return 0

      var indent = this.$getIndent(doc.getLine(openBracePos.row))
      doc.replace(new Range(row, 0, row, column - 1), indent)
    }

    this.$getIndent = function(line) {
      return line.match(/^\s*/)[0]
    }
  }).call(MatchingBraceOutdent.prototype)

  exports.MatchingBraceOutdent = MatchingBraceOutdent
})

define('ace/mode/behaviour/css', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {
  'use strict'

  var oop = require('../../lib/oop')
  var Behaviour = require('../behaviour').Behaviour
  var CstyleBehaviour = require('./cstyle').CstyleBehaviour
  var TokenIterator = require('../../token_iterator').TokenIterator

  var CssBehaviour = function() {
    this.inherit(CstyleBehaviour)

    this.add('colon', 'insertion', function(state, action, editor, session, text) {
      if (text === ':' && editor.selection.isEmpty()) {
        var cursor = editor.getCursorPosition()
        var iterator = new TokenIterator(session, cursor.row, cursor.column)
        var token = iterator.getCurrentToken()
        if (token && token.value.match(/\s+/)) {
          token = iterator.stepBackward()
        }
        if (token && token.type === 'support.type') {
          var line = session.doc.getLine(cursor.row)
          var rightChar = line.substring(cursor.column, cursor.column + 1)
          if (rightChar === ':') {
            return {
              text: '',
              selection: [1, 1]
            }
          }
          if (/^(\s+[^;]|\s*$)/.test(line.substring(cursor.column))) {
            return {
              text: ':;',
              selection: [1, 1]
            }
          }
        }
      }
    })

    this.add('colon', 'deletion', function(state, action, editor, session, range) {
      var selected = session.doc.getTextRange(range)
      if (!range.isMultiLine() && selected === ':') {
        var cursor = editor.getCursorPosition()
        var iterator = new TokenIterator(session, cursor.row, cursor.column)
        var token = iterator.getCurrentToken()
        if (token && token.value.match(/\s+/)) {
          token = iterator.stepBackward()
        }
        if (token && token.type === 'support.type') {
          var line = session.doc.getLine(range.start.row)
          var rightChar = line.substring(range.end.column, range.end.column + 1)
          if (rightChar === ';') {
            range.end.column++
            return range
          }
        }
      }
    })

    this.add('semicolon', 'insertion', function(state, action, editor, session, text) {
      if (text === ';' && editor.selection.isEmpty()) {
        var cursor = editor.getCursorPosition()
        var line = session.doc.getLine(cursor.row)
        var rightChar = line.substring(cursor.column, cursor.column + 1)
        if (rightChar === ';') {
          return {
            text: '',
            selection: [1, 1]
          }
        }
      }
    })

    this.add('!important', 'insertion', function(state, action, editor, session, text) {
      if (text === '!' && editor.selection.isEmpty()) {
        var cursor = editor.getCursorPosition()
        var line = session.doc.getLine(cursor.row)

        if (/^\s*(;|}|$)/.test(line.substring(cursor.column))) {
          return {
            text: '!important',
            selection: [10, 10]
          }
        }
      }
    })
  }
  oop.inherits(CssBehaviour, CstyleBehaviour)

  exports.CssBehaviour = CssBehaviour
})

define('ace/mode/folding/cstyle', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {
  'use strict'

  var oop = require('../../lib/oop')
  var Range = require('../../range').Range
  var BaseFoldMode = require('./fold_mode').FoldMode

  var FoldMode = exports.FoldMode = function(commentRegex) {
    if (commentRegex) {
      this.foldingStartMarker = new RegExp(
        this.foldingStartMarker.source.replace(/\|[^|]*?$/, '|' + commentRegex.start)
      )
      this.foldingStopMarker = new RegExp(
        this.foldingStopMarker.source.replace(/\|[^|]*?$/, '|' + commentRegex.end)
      )
    }
  }
  oop.inherits(FoldMode, BaseFoldMode);

  (function() {
    this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/
    this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/
    this.singleLineBlockCommentRe = /^\s*(\/\*).*\*\/\s*$/
    this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/
    this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/
    this._getFoldWidgetBase = this.getFoldWidget
    this.getFoldWidget = function(session, foldStyle, row) {
      var line = session.getLine(row)

      if (this.singleLineBlockCommentRe.test(line)) {
        if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) { return '' }
      }

      var fw = this._getFoldWidgetBase(session, foldStyle, row)

      if (!fw && this.startRegionRe.test(line)) { return 'start' } // lineCommentRegionStart

      return fw
    }

    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
      var line = session.getLine(row)

      if (this.startRegionRe.test(line)) { return this.getCommentRegionBlock(session, line, row) }

      var match = line.match(this.foldingStartMarker)
      if (match) {
        var i = match.index

        if (match[1]) { return this.openingBracketBlock(session, match[1], row, i) }

        var range = session.getCommentFoldRange(row, i + match[0].length, 1)

        if (range && !range.isMultiLine()) {
          if (forceMultiline) {
            range = this.getSectionRange(session, row)
          } else if (foldStyle != 'all') { range = null }
        }

        return range
      }

      if (foldStyle === 'markbegin') { return }

      var match = line.match(this.foldingStopMarker)
      if (match) {
        var i = match.index + match[0].length

        if (match[1]) { return this.closingBracketBlock(session, match[1], row, i) }

        return session.getCommentFoldRange(row, i, -1)
      }
    }

    this.getSectionRange = function(session, row) {
      var line = session.getLine(row)
      var startIndent = line.search(/\S/)
      var startRow = row
      var startColumn = line.length
      row = row + 1
      var endRow = row
      var maxRow = session.getLength()
      while (++row < maxRow) {
        line = session.getLine(row)
        var indent = line.search(/\S/)
        if (indent === -1) { continue }
        if (startIndent > indent) { break }
        var subRange = this.getFoldWidgetRange(session, 'all', row)

        if (subRange) {
          if (subRange.start.row <= startRow) {
            break
          } else if (subRange.isMultiLine()) {
            row = subRange.end.row
          } else if (startIndent == indent) {
            break
          }
        }
        endRow = row
      }

      return new Range(startRow, startColumn, endRow, session.getLine(endRow).length)
    }
    this.getCommentRegionBlock = function(session, line, row) {
      var startColumn = line.search(/\s*$/)
      var maxRow = session.getLength()
      var startRow = row

      var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/
      var depth = 1
      while (++row < maxRow) {
        line = session.getLine(row)
        var m = re.exec(line)
        if (!m) continue
        if (m[1]) depth--
        else depth++

        if (!depth) break
      }

      var endRow = row
      if (endRow > startRow) {
        return new Range(startRow, startColumn, endRow, line.length)
      }
    }
  }).call(FoldMode.prototype)
})

define('ace/mode/mask', ['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/text', 'ace/mode/mask_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) {
  'use strict'

  var oop = require('../lib/oop')
  var TextMode = require('./text').Mode
  var MaskHighlightRules = require('./mask_highlight_rules').MaskHighlightRules
  var MatchingBraceOutdent = require('./matching_brace_outdent').MatchingBraceOutdent
  var CssBehaviour = require('./behaviour/css').CssBehaviour
  var CStyleFoldMode = require('./folding/cstyle').FoldMode

  var Mode = function() {
    this.HighlightRules = MaskHighlightRules
    this.$outdent = new MatchingBraceOutdent()
    this.$behaviour = new CssBehaviour()
    this.foldingRules = new CStyleFoldMode()
  }
  oop.inherits(Mode, TextMode);

  (function() {
    this.lineCommentStart = '//'
    this.blockComment = { start: '/*', end: '*/' }

    this.getNextLineIndent = function(state, line, tab) {
      var indent = this.$getIndent(line)
      var tokens = this.getTokenizer().getLineTokens(line, state).tokens
      if (tokens.length && tokens[tokens.length - 1].type == 'comment') {
        return indent
      }

      var match = line.match(/^.*\{\s*$/)
      if (match) {
        indent += tab
      }

      return indent
    }

    this.checkOutdent = function(state, line, input) {
      return this.$outdent.checkOutdent(line, input)
    }

    this.autoOutdent = function(state, doc, row) {
      this.$outdent.autoOutdent(doc, row)
    }

    this.$id = 'ace/mode/mask'
  }).call(Mode.prototype)

  exports.Mode = Mode
});
(function() {
  window.require(['ace/mode/mask'], function(m) {
    if (typeof module === 'object' && typeof exports === 'object' && module) {
      module.exports = m
    }
  })
})()
